perm filename FUNCTS.PAL[U,VDS]1 blob sn#299151 filedate 1977-08-07 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00015 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	.TITLE FUNCTS
C00006 00003	"HERE"   - COMMAND INSTRUCTION
C00007 00004	"POINT"  - COMMAND INSTRUCTION
C00009 00005	"WHERE"  - COMMAND INSTRUCTION
C00012 00006	"TF"     - COMMAND INSTRUCTION
C00013 00007	"CLEAR"  - COMMAND INSTRUCTION
C00016 00008	"LISTT"  - LISTS THE VALUES OF STORED TRANSFORMATION
C00019 00009	"LISTP"  - LISTS THE STEPS OF A USER PROGRAM
C00022 00010	"PUNCHT"&"PUNCHP" - SAME AS LISTT&LISTP TO PAPER TAPE
C00023 00011	"PROGS"  - LISTS THE NAMES OF ALL USER PROGRAMS
C00025 00012	"STATUS" - PRINTS THE CURRENT STATUS OF PROGRAM EXECUTION
C00028 00013	"FREE"   - COMMAND INSTRUCTION
C00030 00014	"EXEC"   - COMMAND INSTRUCTION
C00035 00015	"PROCEED","SNGSTP" - COMMAND INSTRUCTIONS
C00037 ENDMK
C⊗;
.TITLE FUNCTS

;START OF TOP LEVEL ARM PROGRAM

START:	RESET
	MOV 	#STKTOP,SP	;INITIALIZE STACK
   .IFZ LSI
	MOV	#PARVEC+2,PARVEC;ENABLE PARITY ERROR TRAPS
	MOV	#BPT,PARVEC+2
	MOV 	#1,PARCSR
   .ENDC
	MOV	#LOCK,R0	;TRANSFER EIS CONSTANTS FROM ROM TO RAM
	MOV	#CONS,R1
	MOV	#CONE-CONS/2,R3
	MOV	(R1)+,(R0)+
	SOB	R3,.-2
	MTPS	LOCK		;INITIALIZE PROCESSOR STATUS
	MOV	#CLKSER,@#CLKTRP;SET UP CLOCK VECTOR
	MOV	#KLOCK,@#CLKTRP+2
	MOV	#HELLO,SG	;TELL EVERYONE WHO WE ARE
	JSR	PC,INIT		;INITIALIZE?
	JSR	PC,CRLF
MAINL:	MOV	#QUERY,SG	;ASK FOR INSTRUCTION
	JSR	PC,TYPSTR
	MOV	#INBUF,SG	;READ IN A COMMAND INSTRUCTION
	JSR	PC,INSTR
	MOV	#FUNTAB,R0	;DECODE IT,NEED FUNCTION HASH TABLE
	MOV	#CMND,R1	;ONLY LOOK FOR TOP LEVEL COMMANDS
	JSR	PC,PUSARG
	BCC	GOTCOM		;BRANCH IF LEGAL COMMAND
	TST	R1		;TEST IF EMPTY STRING 
	BEQ	MAINL		;LOOP BACK IF EMPTY LINE
	JSR	PC,TYPERR 	;ELSE TYPE ERROR MESSAGE
	BR	MAINL
GOTCOM:	MOV	SP,R4		;PTR TO ARGUMENTS OF STACK
	JSR	PC,@(R0)+	;EXECUTE FUNCTION
	ADD	#MAXARG,SP	;CLEAR ARGUMENT LIST OFF STACK
	BR	MAINL

DONE:	MOV	#GOODBY,R1	;ALL DONE, STOP MONITOR
	JSR	PC,TYPERR
	ADD	#MAXARG+2,SP	;LEAVE STACK CLEAR
	MOV	#2,@#CLKTRP+2	;CLEAR CLOCK INTERRUPT VECTOR
	MOV	#CLKTRP+2,@#CLKTRP
	HLT

QUERY:	.ASCIZ	/./

;END OF TOP LEVEL SEQUENCE
;"HERE"   - COMMAND INSTRUCTION
 
;THIS ROUTINES SETS A GIVEN TRANSFORM EQUAL TO THE PRESENT POSITION
;OF THE ARM.  THE ONLY ARGUMENT REQUIRED FOR THIS FUNCTION IS A PTR
;TO THE TRANSFORMATION.

;REGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

HERE:	MOV	(R4),R3		;GET PTR TO TRANS SYMBOL BLOCK
	JSR	PC,HERESB	;READ AND STORE POSITION
	BCC	.+6		;ERROR?
	JMP	@#TYPERR

	MOV	(R3),R0		;PERMIT EDITING OF TRANSFORM
	JMP	MODTRN


;END OF "HERE"
;"POINT"  - COMMAND INSTRUCTION
 
;THIS COMMAND IS USED FOR INITIALIZING AND EDITING THE X,Y,Z,O,A,T
;VALUES OF A SPECIFIED TRANSFORM.  THE TRANSFORMATION POINTER IS
;ASSUMED TO BE IN THE ARGUMENT LIST ON THE STACK.  IF THE TRANS IS TO
;BE SET EQUAL TO THE VALUE OF ANOTHER TRANSFORM, THIS SECOND TRANS PTR
;MUST ALSO BE ON THE STACK.

;REGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

POINT:	CLR	R3
	MOV	(R4)+,R2	;PTR TO TRANS SYMBOL BLOCK
	MOV	(R2),R0		;PTR TO DATA
	BNE	10$
	MOV	#12.,R0		;GET A BLOCK OF F.S. IF NOT DEFINED
	JSR	PC,GETBLK
	BCS	45$		;NO ROOM?
	MOV	R0,(R2)		;SET PTR TO TRANS DATA AREA
	MOV	#SMPTRN,R3	;INIT. TRANSFORM TO REASONABLE POS
10$:	MOV	(R4),R1		;SET TRANS EQUAL TO ANOTHER TRANS?
	BEQ	20$
	MOV	(R1),R3		;YES
	BEQ	40$		;ERROR IF NO DATA
20$:	TST	R3		;INITIALIZE TRANS?
	BEQ	30$		;NO
	MOV	R0,R1
	MOV	#12.,R4
	MOV	(R3)+,(R1)+
	SOB	R4,.-2
30$:	JMP	@#MODTRN	;PERMIT EDITING OF TRANS

40$:	MOV	#NOTDAT,R1	;SIGNAL NO DATA FOUND WHEN EXPECTED
45$:	JMP	@#TYPERR


;END OF "POINT"
;"WHERE"  - COMMAND INSTRUCTION
 
;THIS COMMAND IS USED FOR TYPING OUT THE CURRENT ARM POSITION.  THE
;ARM POSITION IS PRINTED BOTH IN EULER ANGLES AND JOINT ANGLES.  THE
;HAND OPENING IS ALSO LISTED IN INCHES.  AS A SIDE AFFECT, "WHERE"
;UPDATES "CTRANS" WITH THE CURRENT ARM TRANSFORM.  NO ARGUMENTS ARE
;REQUIRED BY THIS ROUTINE.

;REGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

WHERE:	CLR	R0		;READ JT. ANGLES/HAND OPENING
	MOV	#7,R1		;SEVEN CHANNELS IN ALL
	MOV	#JANGLE,R2
       	JSR	PC,ANGLES	;PUT INTO "JANGLE"
	BCC	WHER1 		;BRANCH IF NO ADC ERROR
	JSR	PC,TYPERR
	BR	WHEDNE		;EXIT
WHER1:	MOV     #HTRAN2,SG	;TYPE OUT THE COLUMN HEADER 
	JSR	PC,LINOUT
	MOV	#CTRANS,R0	;PUT CURRENT TRANSFORM IN HERE
	MOV	#JANGLE,R1	;GET JOINT ANGLES FROM HERE
	JSR	PC,UPDATE	;CONVERT JT. ANGLES TO TRANSFORM
	MOV	#CTRANS,R0	;TYPE OUT THIS TRANSFORM
      	JSR	PC,PTRANS
	MOV	#WHERC1,SG	;TYPE OUT JOINT ANGLES COLUMN HEADER
	JSR	PC,LINOUT
	MOV	#OUTBUF,SG	;CONVERT JOINT ANGLES TO ASCII
	MOV	#JANGLE,R2	;HERE ARE THE ANGLES
	MOV	#6,R3		;PRINT 6 ANGLES AND HAND OPENING
WHER2:	MOV	(R2)+,R0 	;GET AN ANGLE
	JSR	PC,PRTANG	;CONVERT TO ASCII
	MOVB	#40,(SG)+	;PUT IN A SPACE CHARACTER
	SOB	R3,WHER2
	MOV	(R2),R0		;CONVERT THE HAND OPENING TO INCHES
	JSR	PC,PRTDIS
	MOV	#OUTBUF,SG	;PRINT THE ASC STRING
	JSR	PC,LINOUT
WHEDNE:	RTS	PC

WHERC1:	.ASCII	/   JT 1    JT 2    JT 3    JT 4    JT 5    /
	.ASCIZ	/JT 6    HAND/
	.EVEN

;END OF "WHERE"
;"TF"     - COMMAND INSTRUCTION
 
;THIS ROUTINES INITIALIZES THE VALUE OF ONE TRANSFORM.  IT REQUIRES
;AS ITS ARGUMENTS, THE TRANSFORM NAME AND ITS 6 DEFINING VALUES.

;REGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

TF:   	MOV	(R4)+,R2	;GET PTR TO TRANS SYMBOL BLOCK
	MOV	(R2),R0		;GET PTR TO DATA
	BNE	TF2
	MOV	#12.,R0		;GET A BLOCK OF F.S. IF NOT DEFINED
	JSR	PC,GETBLK
	BCC	.+6		;NO ROOM?
	JMP	@#TYPERR
	MOV	R0,(R2)		;SET PTR TO TRANS DATA AREA
TF2:	MOV	R4,R1		;CONVERT EULER ANGLES TO TRANFORM
	JMP	@#UNEUL 	;DO CONVERSION


;END OF "TF"
;"CLEAR"  - COMMAND INSTRUCTION
 
;THIS COMMAND IS USED FOR RE-INITIALIZING THE ARM PROGRAM.  IT DOES
;THIS BY ZEROING ALL VARIABLE WORDS FROM "ZAPSTR" TO "ZAPEND".  IT ALSO
;RESETS THE LOW CORE TRAP VECTORS.  NO ARGUMENT IS REQUIRED BY THIS
;ROUTINE, HOWEVER RE-CONFIRMATION OF THE CLEAR COMMAND IS REQUESTED.

;REGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

CLEAR:	MOV	#SURE,SG	;REAFFIRM COMMAND REQUEST
	JSR	PC,INIT		;CLEAR IF REQUESTED
	MOV	#CLRFIN,SG	;TELL EVERYONE IT'S DONE
	BCC	.+6
	MOV	#CANCLR,SG	;CANCEL CLEAR COMMAND
	JMP	LINOUT

;SUBR TO INITIALIZE TRAP VECTORS AND ZAP AREA

INIT:	JSR	PC,TYPSTR	;INPUT RESPONSE
	MOV	#INBUF,SG
	JSR	PC,INSTR
	CMPB	#' ,(SG)+	;IGNOR LEADING SPACE CHARACTERS
	BEQ	.-4
	CMPB	#'Y,-1(SG)	;"Y" ?
	BNE	2$
	CMPB	#' ,(SG)+	;IGNOR TRAILING SPACE CHARACTERS
	BEQ	.-4
	TSTB	-1(SG)		;THIS SHOULD BE A NULL
	BNE	2$
   .IFZ LSI
	MOV	@#14,-(SP)	;SAVE DDT BPT
	MOV	@#16,-(SP)
   .ENDC
	MOV	#8*4,R0		;FILL LOW CORE TRAPS
	MOV	#8,R1		;NUMBER OF TRAPS
1$:	MOV	#HLT,-(R0)
	MOV	R0,R2
	MOV	R2,-(R0)
	SOB	R1,1$
   .IFZ LSI
	MOV	(SP)+,@#16
	MOV	(SP)+,@#14
   .ENDC
	MOV	#ZAPEND-ZAPSTR/2,R0	;NUMBER OF WORDS TO ZERO
	MOV	#ZAPSTR,R1	;START CLEARING AT THIS LOCATION
	CLR	(R1)+
	SOB	R0,.-2
	BR	.+4
2$:	SEC
	RTS	PC

SURE:	.ASCIZ	/ARE YOU SURE (Y,N)? /
CLRFIN:	.ASCIZ	/ARM PROGRAM RE-INITIALIZED, ALL FREE STORAGE RECLAIMED/
CANCLR:	.ASCIZ	/CLEAR COMMAND ABORTED/
	.EVEN

;END OF "CLEAR"
;"LISTT"  - LISTS THE VALUES OF STORED TRANSFORMATION

;LISTS UP TO EIGHT TRANSFORMATIONS THAT ARE SPECIFIED BY THE USER.
;IT IS ASSUMED THAT THE TRANSFORMATIONS SYMBOL BLOCK POINTERS ARE
;ON THE STACK.  IF NO TRANSFORMATIONS ARE SPECIFIED, ALL EXISTING
;TRANSFORMATIONS ARE LISTED.

;REGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

LISTT:	MOV	#HTRANS,SG	;PRINT THE HEADER
	JSR	PC,LINOUT
	CLR	@#ISPNHT	;INDICATE "LISTT" INSTRUCTION

LSTSTR:	CLR	R3		;# OF TRANS' PRINTED
	MOV	#8.,R2		;LIMITED LIST OF 8 MAX
LISTT1:	MOV	(R4)+,R0
	BEQ	DNTPTR
	MOV	@#ISPNHT,R1	;PRINT ALL SPECIFIED TRANSFORMS
	JSR	PC,PTRTRN
	INC	R3		;ONE MORE TRANS PRINTED
DNTPTR:	JSR	PC,TICKLE	;ABORT?
	BCS	LSTTER
	SOB	R2,LISTT1
	TST	R3		;PRINT ALL TRANS' IF NONE SPECIFIED
	BNE	LSTDNE

LSTALL:	MOV	#32.,R2		;CHECK ALL 32. HASH BUCKETS FOR TRANS
	MOV	#VARTAB,R3	;PTR TO FIRST BUCKET
10$:	MOV	(R3)+,R4	;GET FIRST POINTER
	BEQ	40$
20$:	BITB	#TRANS,TYPBIT(R4)	;CHECK IF TRANS VARIABLE
	BEQ	30$
	MOV	R4,R0		;GOT A TRANS, PRINT IT
	MOV	@#ISPNHT,R1
	JSR	PC,PTRTRN
30$:	JSR	PC,TICKLE	;ABORT?
	BCS	LSTTER
	MOV	LINK(R4),R4	;NEXT ITEM IN BUCKET
	BNE	20$		
40$:	SOB	R2,10$		;REPEAT FOR ALL BUCKETS
	BR	LSTDNE

LSTTER:	JSR	PC,TYPERR
LSTDNE:	TST	@#ISPNHT	;NEED MORE BLANK TAPE?
	BEQ	.+6
	JSR	PC,NULLS
	RTS	PC

;END OF "LISTT"
;"LISTP"  - LISTS THE STEPS OF A USER PROGRAM

;LISTS THE SPECIFIED STEPS OF A USER PROGRAM.  IF NO FIRST STEP IS
;SPECIFIED, STEP ONE IS ASSUMED.  IF NO LAST STEP IS SPECIFIED,
;PRINTING IS CONTINUED UNTIL THE END OF THE PROGRAM IS ENCOUNTERED.
;THE ARGUMENTS FOR THIS ROUTINE ARE ASSUMED TO BE ON THE STACK IN THE
;FOLLOWING ASCENDING ORDER: PROGRAM PTR, 1ST STEP, LAST STEP.

;REGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

LISTP:	CLR	@#ISPNHP	;INDICATE "LISTP"

LSPSTR:	MOV	(R4)+,R0	;PTR TO PROGRAM SYMBOL BLOCK
	MOV	R0,@#LPROG
	MOV	#LSTPMS,SG	;TYPE PROGRAM NAME
	JSR	PC,TYPSTR
	MOV	#OUTBUF,SG
	JSR	PC,PACNMS
	MOV	#OUTBUF,SG
	JSR	PC,LINOUT
	MOV	R0,R1		;PTR TO PROGRAM SYMBOL BLOCK
	TST	(R1)		;ANY STEPS DEFINED?
	BEQ	LSTPDN
	MOV	(R4)+,R2	;FIRST STEP NUMBER
	BGT	.+6
	MOV	#1,R2		;DEFAULT = STEP 1
	MOV	(R4)+,R3	;FINAL STEP NUMBER
	BGT	.+6
	MOV	#77777,R3	;DEFAULT = LAST PROGRAM STEP
	SUB	R2,R3		;NUMBER OF STEPS TO PRINT-1
	BGE	LISTP2
	MOV	#BADSTP,R1	;SIGNAL ERROR IF FINAL<FIRST
	BR	LSTPER
LISTP2:	INC	R3
       	MOV	R2,R4		;GET FIRST REQUESTED STEP
LISTP3:	MOV	(R1),R1
	BEQ	LSTPDN		;NOTHING TO DO IF PAST END
	SOB	R4,LISTP3
LISTP4:	MOV	R2,R0		;PRINT THE REQUESTED STEPS
	JSR	PC,PSTEP
	INC	R2		;INCREASE STEP NUMBER
	MOV	(R1),R1
	BEQ	LSTPDN		;DONE IF END OF PROGRAM
	JSR	PC,TICKLE	;ABORT?
	BCS	LSTPER
	SOB	R3,LISTP4
	BR	LSTPDN

LSTPER:	JSR	PC,TYPERR
LSTPDN:	JSR	PC,CRLF
	TST	@#ISPNHP	;NEED MORE BLANK TAPE?
	BEQ	.+6
	JSR	PC,NULLS
	RTS	PC

LSTPMS:	.ASCIZ	/DEFPRO /
	.EVEN

;END OF "LISTP"
;"PUNCHT"&"PUNCHP" - SAME AS LISTT&LISTP TO PAPER TAPE

;THESE ROUTINES ARE IDENTICAL TO "LISTT" AND "LISTP" EXCEPT THAT
;NO HEADERS ARE TYPED OUT AND INSTEAD NULL CHARACTERS ARE PRINTED
;BEFORE AND AFTER THE DATA TO PROVIDE SOME BLANK LEADER.

;REGISTERS USED:
;
;	ALL REGISTERS ARE AVAILABLE FOR USE

PUNCHT:	JSR	PC,NULLS	;PUNCH OUT A LEADER TAPE
	MOV	#-1,@#ISPNHT	;INDICATE PUNCHT COMMAND
	JMP	LSTSTR		;NOW JUST LIKE "LISTT"

PUNCHP:	JSR	PC,NULLS	;PUNCH OUT A LEADER TAPE
	MOV	#-1,@#ISPNHP	;INDICATE PUNCHT COMMAND
	JMP	LSPSTR		;NOW JUST LIKE "LISTP"

;END OF "PUNCHT"&"PUNCHP"
;"PROGS"  - LISTS THE NAMES OF ALL USER PROGRAMS

;THIS ROUTINE LISTS THE NAMES OF ALL USER PROGRAMS THAT HAVE AT
;LEAST ONE PROGRAM STEP DEFINED.  IT REQUIRES NO ARGMENTS.

;REGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

PROGS: 	MOV	#32.,R2		;CHECK ALL 32. HASH BUCKETS FOR PROGS
	MOV	#VARTAB,R3	;PTR TO FIRST BUCKET
	MOV	#"  ,@#OUTBUF
1$:	MOV	(R3)+,R4	;GET FIRST POINTER
	BEQ	4$
2$:	BITB	#PROG,TYPBIT(R4);CHECK IF PROGRAM NAME
	BEQ	3$
	TST	(R4)		;ANY PROG STEPS DEFINED?
	BEQ	3$		;NO
	MOV	R4,R0		;GOT A PROGRAM NAME, PRINT IT
	MOV	#OUTBUF+2,SG
	JSR	PC,PACNMS
	MOV	#OUTBUF,SG
	JSR	PC,LINOUT
3$:	JSR	PC,TICKLE	;ABORT?
	BCS	PABORT
	MOV	LINK(R4),R4	;NEXT ITEM IN BUCKET
	BNE	2$		
4$:	SOB	R2,1$		;REPEAT FOR ALL BUCKETS
	BR	PROGDN

PABORT:	JSR	PC,TYPERR
PROGDN:	RTS	PC

;END OF "PROGS"
;"STATUS" - PRINTS THE CURRENT STATUS OF PROGRAM EXECUTION

;THIS ROQTINE LISTS THE LEVELS OF "GOSUB" CALLS THAT ARE NOW ACTIVE
;AND THE NUMBER OF PROGRAM LOKP EXECUTED AND THOSE REMAINING.

;BEGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

STATUS:	MOV	#SUBSTK+2,R3	;SUBR STACK
	MOV	#STAHDR,SG	;PRINT HEADER
	JSR	PC,LINOUT
	MOV	#"  ,@#OUTBUF
1$:	MOV	#OUTBUF+2,SG
	MOV	-(R3),R0	;GET SUBR NAME
	BEQ	4$
	JSR	PC,PACNME	;SAVE IN OUTBUF
	MOV	-(R3),R2	;RETURN ADDR
	BEQ	3$
	MOV	(R0),R1		;COMPUTE STEP NUMBER
	CLR	R0
	BR	.+4
2$:	MOV	(R1),R1		;KEEP MOVING
	INC	R0
	CMP	R1,R2		;FOUND STEP?
	BNE	2$		;NO
	MOVB	#' ,(SG)+
	JSR	PC,PTSINT	;YES, CONVERT TO ASCII
3$:	MOV	#OUTBUF,SG
	JSR	PC,LINOUT
	CMP	R3,@#SUBPTR	;END OF LIST?
	BGT	1$		;NO
4$:	MOV	#LOPHDR,SG	;TYPE OUT NUMBER OF LOOPS EXECUTED
	JSR	PC,TYPSTR
	MOV	#OUTBUF,SG
	MOV	@#LOPCNT,R0
	BIC	#100000,R0
	JSR	PC,PTSINT
	MOV	#OUTBUF,SG
	JSR	PC,LINOUT
	MOV	#LOPHD2,SG	;TYPE OUT NUMBER OF LOOPS REMAINING
	JSR	PC,TYPSTR
	MOV	#INFMES,SG
	MOV	@#EXECNT,R0
	BMI	5$
	MOV	#OUTBUF,SG
	JSR	PC,PTSINT
	MOV	#OUTBUF,SG
5$:	JSR	PC,LINOUT
	RTS	PC

STAHDR:	.ASCIZ	/RTN   LAST STEP/
LOPHDR:	.ASCIZ	/
NUMBER OF LOOPS EXECUTED = /
LOPHD2:	.ASCIZ	/NUMBER OF LOOPS REMAINING = /
INFMES:	.ASCIZ	/INFINITE/
	.EVEN

;END OF "STATUS"
;"FREE"   - COMMAND INSTRUCTION
 
;THIS ROUTINE TYPES OUT THE AMOUNT OF FREE STORAGE SPACE THAT IS
;NOT CURRENTLY BEING USED.  NO ARGUMENTS ARE REQUIRED.

;REGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

FREE:	CLR	R5		;NUMBER OF FREE BYTES
	MOV	#10000.,R0	;100% FREE?
	TST	@#FSPTR
	BEQ	ALLFRE		;YES
	MOV	#FREEST+2,R2	;START ADDING FROM HERE
	MOV	@#HICORE,R4	;END OF F.S.
FREELP:	MOV	(R2),R3		;NEXT BOUNDARY TAG
	BEQ	FREEER		;CAN'T EVER BE THIS
	BPL	MOREFR		;>0 INDICATES NOT BEING USED
	NEG	R3		;ON TO NEXT
	BR	NXTBLK
MOREFR:	ADD	R3,R5		;ADD TO FREE SUM
NXTBLK:	MOV	R2,R1		;CHECK FOR VALID BOUNDARY TAGS
	ADD	R3,R2
	CMP	(R1),-2(R2)	;HI=LOW?
	BNE	FREEER
	CMP	R4,R2		;END OF F.S.?
	BHI	FREELP
	SUB	#FREEST,R4	;TOTAL SIZE OF F.S AREA
	TST	-(R4)
	MUL	R5,R0		;COMPUTE PERCENTAGE FREE
	DIV	R4,R0
ALLFRE:	MOV	#FREMES,SG	;TYPE OUTPUT MESSAGE
	JSR	PC,TYPSTR
	MOV	#OUTBUF,SG	;CONVERT PERCENTAGE TO ASCII
	JSR	PC,PTSHUN
	MOVB	#45,(SG)+	;%
	CLRB	(SG)
	MOV	#OUTBUF,SG
	JSR	PC,LINOUT
	BR	FREDNE

FREEER:	MOV	#BADFRE,R1	;SAY F.S. AREA IN WRONG FORMAT
	JSR	PC,TYPERR

FREDNE:	RTS	PC

FREMES:	.ASCIZ	/UNUSED FREE STORAGE = /
	.EVEN

;END OF "FREE"
;"EXEC"   - COMMAND INSTRUCTION

;THIS COMMAND IS USED FOR INITIATING ARM MOTION PROGRAMS.  IT
;REQUIRES THREE ARGUMENTS:  A USER PROGRAM NAME, A LOOP COUNT, AND
;A STARTING STEP NUMBER FOR THE FIRST PASS.  IF THE PROGRAM NAME IS
;OMITTED, THE LAST PROGRAM EXECUTED IS AGAIN RUN.  IF THE COUNT IS
;MISSING, ONE PASS IS ASSUMED.  A PASS ENDS WHENEVER A "STOP"
;INSTRUCTION IS ENCOUNTERED.  FOR MULTIPLE PASS COMMANDS, THE STOP
;MESSAGE IS SUPPRESSED UNTIL THE FINAL PASS IS COMPLETED.
;IF THE STARTING STEP NUMBER IS OMITTED, EXECUTION BEGINS
;WITH THE FIRST PROGRAM INSTRUCTION.

;REGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

EXEC:	CLR	@#ARMS		;CLEAR ALL FLAGS
	MOV	(R4)+,R2	;PROGRAM PTR
	BNE	1$
	MOV	#NOPROG,R1	;ERROR CODE IF NO PROGS EXECUTED YET
	MOV	@#SUBSTK,R2	;RE-TRY LAST PROGRAM
	BNE	1$
	JMP	EXECER
1$:	MOV	R2,@#SUBSTK	;SET-UP SUBROUTINE STACK
	MOV	#SUBSTK-2,@#SUBPTR
       	MOV	#NULPRG,R1	;ERROR MESSAGE FOR NO PROGRAM STEPS
	MOV	(R2),R2		;PTR TO FIRST STEP TO EXECUTE
	BNE	.+6
	JMP	EXECER
	MOV	(R4)+,R0
	BNE	.+6
	MOV	#1,R0		;DEFAULT = 1 PASS
	MOV	R0,@#EXECNT	;PASS COUNT
	CLR	@#LOPCNT
	MOV	(R4)+,R0	;GET STARTING STEP NUMBER
	DEC	R0
	BLE	3$		;START WITH FIRST STEP
2$:	MOV	(R2),R2		;MOVE DOWN TO STARTING STEP
	BEQ	.+4		;CANT MOVE PAST END
	SOB	R0,2$
3$:	MOV	R2,@SUBPTR	;SAVE PTR TO FIRST STEP TO EXEC
	CLR	@#NSPEED	;NORMAL SPEED
	CLR	@#PSPEED
	CLR	@#CONFIG	;NO SPECIAL CONFIGURATION
	CLR	@#MODES		;NO PARTICULAR SERVO MODES
	CLR	@#PMODES
	CLR	@#JTBITS	;NO SPECIAL JT IN TOLERANCE BITS


EXECST:	CLR	R0		;READ CURRENT JT. ANGLES+HAND OPENING
	MOV	#7,R1		;SEVEN CHANNELS IN ALL
	MOV	#DANGLE,R2	;SAVE IN HERE
	JSR	PC,ANGLES
	BCS	EXECER		;BRANCH IF ADC DEAD
	MOV	#DACVAL,R0	;INIT. DACS TO THE CURRENT POSITION
	JSR	PC,TODAC
	JSR	PC,REFRESH
	MOV	#NEWDAC,R0	;NEWDAC ← DACVAL
	MOV	#DACVAL,R1
	MOV	#7,R2
1$:	MOV	(R1)+,(R0)+
	SOB	R2,1$
	CLR	@#BRAKES	;RESET ALL HARDWARE BITS
	MOV	#SWAIT,@#WAITNG	;SET START WAIT COUNT
	MTPS	UNLOCK		;LET THE CLOCK INTERRUPT
	CLKON
	MOV	#DANGLE,R0	;DETERMINE CURRENT ARM CONFIGURATION
	JSR	PC,FLAGS
	MOV	@SUBPTR,R4	;ADDR. OF STEP TO EXECUTE
	ADD	#2,@#SUBPTR
	BR	TSTSTP

TOPER:	INC	@#EXECNT
TOTOP:	MOV	@SUBSTK,R3	;RESTART AT TOP OF PROGRAM
	MOV	#SUBSTK,@#SUBPTR;RESET SUBR CALL STACK
GOSTEP:	MOV	(R3)+,R4	;NEXT STEP TO EXECUTE
	MOV	(R3)+,R1	;PTR TO MOTION FUNCTION
	BIC	#1,R1		;DELETE ANY LABEL MARKERS
	JSR	PC,@(R1)+	;EXECUTE MOTION FUNCTION
	TST	@#ARMS  	;ANY ERROR BITS SET?
	BNE	TELSTP		;YES
TSTSTP:	MOV	R4,R3		;END OF PASS?
	BNE	GOSTEP
	INC	@#LOPCNT
	DEC	@#EXECNT	;LAST PASS?
	BGT	TOTOP 
	BMI	TOPER		;INFINITE LOOP
	MOV	#FINI,R1	;SIGNAL ALL DONE
	CLR	@#ARMS
	BR	.+6

TELSTP:	MOV	#UHALT,R1	;PRINT ERROR MESSAGE

	SUB	#2,@#SUBPTR	;SAVE PTR TO NEXT STEP
	MOV	R4,@SUBPTR

EXECER:	MOV	#-1,R0		;SET ALL OF THE BRAKES
	JSR	PC,SETBRK
	CLKOFF			;STOP THE CLOCK INTERRUPTS
	MTPS	LOCK
	JMP	TYPERR		;TYPE ERROR AND RETURN


;END OF "EXEC"
;"PROCEED","SNGSTP" - COMMAND INSTRUCTIONS

;THESE COMMANDS ARE USED FOR CONTINUING THE EXECUTION OF AN ARM
;PROGRAM AFTER IT HAS BEEN TERMINATED BY EITHER A "PAUSE" COMMAND
;OR ANY ONE OF A NUMBER OF ERROR CONDITIONS.  ONLY TERMINATION
;CONDITIONS THAT LEAVE THE "CANPRO" BIT IN THE ARM STATUS WORD
;( "ARMS" ) ON PERMIT THESE FUNCTIONS TO OPERATE.  NO ARGUMENTS
;ARE REQUIRED BY THESE ROUTINES.

;REGISTERS USED:
;	ALL REGISTERS AVAILABLE FOR USE

PROCED:	CLR	R0		;ARMS←0 IF CAN PROCEED
	MOV	#CNTPRO,R1	;ERROR MESSAGE OTHERWISE
	BR	TRYGO

SNGSTP:	MOV	#CANPRO,R0	;ARMS←CANPRO IF CAN PROCEED
	MOV	#CNTSGS,R1

TRYGO:	BIT	#CANPRO,ARMS	;CHECK IF PROCEEDING PERMITTED
	BEQ	NOPROC		;BRANCH IF NOT OK
	MOV	R0,@#ARMS
	JMP	EXECST		;GO CONTINUE EXECUTION

NOPROC:	JMP	TYPERR		;ELSE TYPE ERROR MESSAGE


;END OF "PROCED","SNGSTP"